#include <8052.h>
#include "UART.h"

//串口接收的回调函数
UART_Receive_Callback UART_Receive_Callback_FUN;

//UART初始化
void UART_Init(void)
{
    TMOD = 0x20; //设置定时器1，工作方式2，8位自动重载
    SCON = 0x50; //设置串口工作方式1，允许接收
    TH1 = 0xFD;  //波特率设置为9600
    TL1 = TH1;
    PCON = 0x00; //波特率不加倍
    EA = 1;      //开总中断
    ES = 1;      //允许串联1中断
    TR1 = 1;     //启动定时器T1
}

//使用定时器接收串口数据
//发送中断标志位。TI=1,表示已结束一帧数据发送，可由软件查询TI位标志，也可以向CPU申请中断。
//接收中断标志位。RI=1，表示一帧数据接收结束，可由软件查询RI位标志，也可以向CPU申请中断。
// 注意：TI和RI在任何工作方式下必须由软件清0
void UART_Interrupt4(void) __interrupt 4
{
    if (RI)
    {
        //add your code here!
        //回调
        if (UART_Receive_Callback_FUN)
        {
            UART_Receive_Callback_FUN(SBUF);
        }
        RI = 0;
    }
}
//设置串接收数据的回调方法
void UART_SET_Interrupt4_Callback(UART_Receive_Callback callback)
{
    UART_Receive_Callback_FUN = callback;
}

//向外（电脑端）发送一个字节
void UART_SendOneByte(unsigned char c)
{
    SBUF = c;
    while (!TI)
        ;
    TI = 0;
}

void UART_SendIntData(int data)
{
    // while (d)
    // {
    //     UART_SendOneByte(d % 10 + 48);
    //     d = d / 10;
    // }
    if (data < 0)
    {
        UART_SendOneByte('-');
        data = -data;
    }

    //使用堆栈把数据倒序
    __xdata char stack[5]; //max:65536
    char count = 0;
    do
    {
        stack[count++] = data % 10;
        data /= 10;
    } while (data > 0);
    while (count--)
    {
        //转换为assic码
        char d = stack[count] + 48;
        UART_SendOneByte(d);
    }
}

//向外（电脑端）发送字符串
void UART_SendString(char *str, unsigned char len)
{
    while (len--)
    {
        SBUF = *str++;
        while (!TI)
            ;
        TI = 0;
    }
}